//
//  StatusListViewModel.swift
//  weibo
//
//  Created by Fly on 2018/1/29.
//  Copyright © 2018年 Fly. All rights reserved.
//

import Foundation

/// 微博数据列表视图模型
/*
 Swift 允许类不继承 NSObject，OC 的类都要继承NSObject
 如果类需要使用 KVC 或者 字典转模型框架设置对象值，类就需要继承 NSObject
 如果类只是包装一些代码逻辑，则可以不用继承任何父类，好处：更加的轻量级
 */

/// 上拉刷新最大尝试次数
private let maxPullupTryTimes = 3

class StatusListViewModel {
    
    lazy var statusList = [StatusModel]()
    
    /// 上拉刷新错误次数
    private var pullupErrorTime = 0
    
    /// 加载微博列表
    ///
    /// - Parameters:
    ///   - pullUp: 是否上拉刷新标记
    ///   - completion: 完成回调（网络请求是否成功，是否有更多的上拉刷新）
    func loadStatus(pullUp: Bool, completion:@escaping (_ isSuccess: Bool, _ shouldRefresh: Bool)->()) {
        
        // 判断是否是上拉刷新，同时检查刷新错误
        if pullUp && pullupErrorTime > maxPullupTryTimes {
            completion(true, false)
            return
        }
        
        // 下拉刷新,取出数组的的第一条内容的 id
        let since_id = pullUp ? 0 : (statusList.first?.id ?? 0)
        
        // 上拉刷新,取出数组的的最后一条内容的 id
        var max_id = (!pullUp) ? 0 : (statusList.last?.id ?? 0)
        
        //防止每次刷新的最后一天内容出现两次
        max_id = max_id > 0 ? max_id - 1 : 0
        
        NetworkManager.networkManager.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            
            // 1.字典转模型
            guard let array = NSArray.yy_modelArray(with: StatusModel.self, json: list ?? []) as? [StatusModel] else {
            
                completion(isSuccess, false)
                
                return
                
            }
            
            // 2.数据拼接
            if pullUp {
                
                // 上拉刷新结束，将结果拼到数组末尾
                self.statusList += array
            
            }
            else
            {
                
                // 下拉刷新应该将新的数据数组拼接到现数组的前面
                self.statusList = array + self.statusList
            
            }
            
            // 判断上拉刷新的数据量
            if pullUp && array.count == 0 {
            
                self.pullupErrorTime += 1
                
                completion(isSuccess, false)
                
            }
            else {
                // 3.完成回调
                completion(isSuccess, true)
            
            }
        }
    }
    
}
